#include "bubblesort.h"

// 构造函数：初始化 bars，将传入值包装为 SortBar 并设置默认颜色
BubbleSort::BubbleSort(const QVector<int> &values) {
    for (int v : values)
        bars.append({v, Qt::lightGray});
    i = 0;
    j = 0;
}

// 执行一步冒泡排序的操作
void BubbleSort::step() {
    // 若排序完成或所有轮次已遍历完，标记为已排序
    if (sorted || i >= bars.size()) {
        sorted = true;
        return;
    }

    // 每次 step 前重置所有柱子的颜色
    for (auto &bar : bars)
        bar.color = Qt::lightGray;

    // 若内层循环未结束
    if (j < bars.size() - i - 1) {
        // 标记当前比较的两个元素颜色
        bars[j].color = Qt::red;
        bars[j + 1].color = Qt::green;
        compareCount++;

        // 根据当前设置的排序方向进行比较与交换
        if ((sortOrder == SortOrder::Ascending && bars[j].value > bars[j + 1].value) ||
            (sortOrder == SortOrder::Descending && bars[j].value < bars[j + 1].value)) {
            std::swap(bars[j], bars[j + 1]);
            swapCount++;
        }

        // 移动内层指针
        j++;
    } else {
        // 一轮完成后，重置 j 并进入下一轮外层循环
        j = 0;
        i++;
    }
}

// 判断排序是否完成
bool BubbleSort::isFinished() const {
    return sorted;
}

// 获取当前排序数据（含颜色信息）
const QVector<SortBar>& BubbleSort::getData() const {
    return bars;
}

// 获取比较次数并重置
int BubbleSort::getAndResetCompareCount() {
    int c = compareCount;
    compareCount = 0;
    return c;
}

// 获取交换次数并重置
int BubbleSort::getAndResetSwapCount() {
    int s = swapCount;
    swapCount = 0;
    return s;
}

// 返回算法复杂度说明
QString BubbleSort::getComplexityInfo() const {
    return "平均 O(n²)，最好 O(n)，最坏 O(n²)，空间复杂度 O(1)";
}

// 设置排序方向（升序或降序）
void BubbleSort::setOrder(SortOrder order) {
    sortOrder = order;
}
